"use strict";
// vvvv
// fff
// dddd 
// TypeScript 基础类型
//  任意类型的   通用类型 可以使用any 可以为任意类型的赋值操作
//  数字类型 numberw
// 字符串的类型 string 
// 布尔的操作 boolean
//  数组是没有类型操作的 可以直接加上【】 或者 Array<number>
//   元祖 没有操作类型 元组类型用来表示已知元素数量和类型的数组，各元素的类型不必相同，对应位置的类型需要相同。
// 枚举  enum  用于定义数值集合
//  void  这个和java的 返回值很想 其实就是一毛一样的
//  null  表示对象值缺失 完全没有一样的
//  undefined  表示一个值没有定义、 
//  never   never 是其他类型 暴扣null 和undefind的子类型 从不会出现的值
// dd 
//  any  类型
//  任意值 是typescript 针对编程不明确的使用的的这一种数据类型 它常用三个
//  变量的值会动态改变的时候比如用户数饿输入可以市人医累的编译直接跳过
//  例如;
//  let  x:any=1;
//   x='666666';
//   console.log(x); 
//   x=false;
//移除检查的方式 存在但是就是不检查 哎 就是玩
// x.toFixed()
//  就是如同上面的例子的这样的、 可以随意的任何类型的
// let x:any=4
// x.toFixed()//正确
// console.log(x);
// Null 和 Undefined
// null
// 在 JavaScript 中 null 表示 "什么都没有"。
// null是一个只有一个值的特殊类型。表示一个空对象引用。
// 用 typeof 检测 null 返回是 object。
// undefined
// 在 JavaScript 中, undefined 是一个没有设置值的变量。
// typeof 一个没有值的变量会返回 undefined。
// Null 和 Undefined 是其他任何类型（包括 void）的子类型，可以赋值给其它类型，如数字类型，此时，赋值后的类型会变成 null 或 undefined。而在TypeScript中启用严格的空校验（--strictNullChecks）特性，就可以使得null 和 undefined 只能被赋值给 void 或本身对应的类型，示例代码如下：
var pp;
pp = 1; //正确
console.log(pp);
//   pp=undefined/运行错误
// pp=null 运行错误
// 上面的例子中变量 pppp 只能是数字类型。如果一个类型可能出现 null 或 undefined， 可以用 | 来支持多种类型，示例代码如下：
// 启用 --strictNullChecks
var pppp;
pppp = 1; // 运行正确
pppp = undefined; // 运行正确
pppp = null; // 运行正确
var x;
var y;
// 运行错误，数字类型不能转为 never 类型
// x = 123;
// 运行正确，never 类型可以赋值给 never类型
x = (function () { throw new Error('exception'); })();
// 运行正确，never 类型可以赋值给 数字类型
y = (function () { throw new Error('exception'); })();
// 返回值为 never 的函数可以是抛出异常的情况
function error(message) {
    throw new Error(message);
}
// 返回值为 never 的函数可以是无法被执行到的终止点的情况
function loop() {
    while (true) { }
}
// 变量申明 ts 的写法
//  var  变量名 :变量类型=值
// 例如
// var uname:string = "Runoob";
// console.log(uname);
// 但是你申明之后 不赋值操作 就会直接变成undefined
// 例如
// var app:string;
// console.log(app);
// 你申明一个变量却不指向什么类型的值 那么就会产生一个任意类型的值
//  var app=99;
//  console.log(typeof app);
//  声明变量没有设置类型和初始值，类型可以是任意类型，默认初始值为 undefined：
//  var [变量名];
//  例如：
//  var uname;
// var uname:string='Runoob';
// var score1:number = 50;
// var score2:number = 42.50
// var sum = score1 + score2
// console.log("名字: "+ uname)
// console.log("第一个科目成绩: "+score1)
// console.log("第二个科目成绩: "+score2)
// console.log("总成绩: "+sum)
// 变量不要使用 name 否则会与 DOM 中的全局 window 对象下的 name 属性出现了重名。
// TypeScript 遵循强类型，如果将不同的类型赋值给变量会编译错误，如下实例：
// var num:number = "hello"     // 这个代码会编译错误
// 类型语言 设计的时候 就 可以实现从一种类型到另外一种类型的改变
//  例如
//  var str='1';
//  console.log(typeof str);
//  var  str2:number=<number> <any> str;
//  console.log(typeof str2);
//  还有就是 设计者考虑到如何判断 这个类型是不是满足了 当前的类型设置
// TypeScript 是怎么确定单个断言是否足够
// 当 S 类型是 T 类型的子集，或者 T 类型是 S 类型的子集时，S 能被成功断言成 T。这是为了在进行类型断言时提供额外的安全性，完全毫无根据的断言是危险的，如果你想这么做，你可以使用 any。
// 它之所以不被称为类型转换，是因为转换通常意味着某种运行时的支持。但是，类型断言纯粹是一个编译时语法，同时，它也是一种为编译器提供关于如何分析代码的方法。
// 编译后，以上代码会生成如下 JavaScript 代码：
// var str = '1';
// var str2 = str;  //str、str2 是 string 类型
// console.log(str2);
//  本来想做一个牛逼一点的类型推断 但是好像没有那么吊  直接面向所有类型了
// 类型推断
// 当类型没有给出时，TypeScript 编译器利用类型推断来推断类型。
// 如果由于缺乏声明而不能推断出类型，那么它的类型被视作默认的动态 any 类型。
// var num = 2;    // 类型推断为 number
// console.log("num 变量的值为 "+num); 
// num = "12";    // 编译错误
// console.log(num);
// var global_num = 12          // 全局变量
// class Numbers { 
//    num_val = 13;             // 实例变量
//    static sval = 10;         // 静态变量
//    storeNum():void { 
//       var local_num = 14;    // 局部变量
//    } 
// } 
// console.log("全局变量为: "+global_num)  
// console.log(Numbers.sval)   // 静态变量
// var obj = new Numbers(); 
// console.log("实例变量: "+obj.num_val)
// 以上代码使用 tsc 命令编译为 JavaScript 代码为：
// var global_num = 12; // 全局变量
// var Numbers = /** @class */ (function () {
//     function Numbers() {
//         this.num_val = 13; // 实例变量
//     }
//     Numbers.prototype.storeNum = function () {
//         var local_num = 14; // 局部变量
//     };
//     Numbers.sval = 10; // 静态变量
//     return Numbers;
// }());
// console.log("全局变量为: " + global_num);
// console.log(Numbers.sval); // 静态变量
// var obj = new Numbers();
// console.log("实例变量: " + obj.num_val);
// 执行以上 JavaScript 代码，输出结果为：
// 全局变量为: 12
// 10
// 实例变量: 13
// 如果我们在方法外部调用局部变量 local_num，会报错：
// error TS2322: Could not find symbol 'local_num'.
// 书写ts 的语法的时候我们必须使用ts 结束
var message = 'nihaoshiie';
console.log(message);
var update = 123;
console.log(update);
var ppp = true;
console.log(ppp);
//  typescript 基础语法 
//  模块
//  函数
//  变量
//  语句和表达式
//  注释
// 解释一下转换的时候的 0TypeSCRIPT基础语法.ts==> tsc 0TypeSCRIPT基础语法.ts==>0TypeSCRIPT基础语法.js这样转换的
// 分号是可选的
// 每行指令都是一段语句，你可以使用分号或不使用， 分号在 TypeScript 中是可选的，建议使用。
// 以下代码都是合法的：
// console.log("Runoob")
// console.log("Google");
// 如果语句写在同一行则一定需要使用分号来分隔，否则会报错，如：
// console.log("Runoob");console.log("Google");
// typescript 是面向对象的实例化管理
//  一定要了解类  与对象的
//  使用类去继承下面对象的方式
var Site = /** @class */ (function () {
    function Site() {
    }
    Site.prototype.name = function () {
        console.log('Runob');
    };
    return Site;
}());
var obj = new Site(); //定义一个对象
obj.name();
